//初始化QuickTips就是为了使带有data-qtip属性的html标签能够在鼠标移上去的时候显示其内容
Ext.QuickTips.init();

Ext.define('leftTreePanel', {
    extend: 'Ext.tree.Panel',
    header: false,
    alias: 'tree',
    layout: 'fit',
    rootVisible: false,
    useArrows: true,// 是否用箭头
    // singleExpand: true,//是否一次只展开树中的一个节点，默认
    viewConfig: {
        plugins: {
            ptype: 'treeviewdragdrop'
        },
        listeners: {
        	beforedrop:function(node, data, overModel, dropPosition, dropHandlers, eOpts ){
        	    dropHandlers.wait = true;//延迟拖入操作，弹出操作框让用户选择是否执行
        	    getChildren(overModel, this.up('treepanel'));
                var lastParentNode = this.up('treepanel').store.getNodeById(data.records[0].data.parentId);//获取拖入节点目前的父节点
                var flag = 1;
                for (var i = 0, length = lastParentNode.childNodes.length; i < length; i++) {//如果该父节点除去该节点之后全是幽灵节点的话就判定这个父节点等一下要合起来
                    if (lastParentNode.childNodes[i].data.id != data.records[0].data.id && lastParentNode.childNodes[i].data.visible != false) {
                        flag = 0;
                        break;
                    }
                }
                this.toClose = flag;
                this.lastParent = lastParentNode.data.id;//将该节点目前的父节点Id保存起来
                if (data.records[0].data.isCreate != 1
                    && overModel.data.isCreate != 1) {// 新建节点不能被托入子节点也不能进行拖动操作
                    this.isAble = 1;
                    this.dragNode = data.records[0];
                } else
                    this.isAble = 0;
                if(data.records[0].data.isCreate == 1|| overModel.data.isCreate == 1 ){
                	Ext.Msg.alert("错误", "不能操作新建节点！");
                	return false;
                }else if(data.records[0].data.parentId == overModel.data.id){
                	Ext.Msg.alert("错误", "不能拖回原父节点！");
                	return false;
                }else if((this.up('treepanel').pattern==1||this.up('treepanel').pattern==2)&&overModel.data.leaf){
                	Ext.Msg.alert("错误", this.up('treepanel').pattern==1?"只能拖入主题文件夹！":"只能拖入测试集文件夹！");
                	return false;
                }else if(overModel.data.author!=currentUserId){
                	Ext.Msg.alert("错误", "你无此权限拖动！");
                	return false;
                }else if(overModel.data.status==2||data.records[0].data.status==2){
                	Ext.Msg.alert("错误", "审核中的节点不能操作！");
                	return false;
                }
        	    var me=this;
        	    Ext.MessageBox.confirm('拖动', '你确定要将'+data.records[0].data.text+'节点移入'+overModel.data.text+'节点吗', function(btn){
        	        if (btn === 'yes') 
        	        	putNodeInto(me, overModel, me.up('treepanel').store,dropHandlers);
        	         else 
        	            dropHandlers.cancelDrop();
        	    });
        	}
        }
    },
    dockedItems: [{
        xtype: 'toolbar',
        items: [{
        	itemId:'leafTreeToolBar1',
            text: '根添加',
            tooltip: '根添加',
            icon: 'static/images/icons/fam/add.gif',
            listeners: {
                click: function () {
                	var pattern=this.up('treepanel').pattern;
                	if(pattern==0)
                		addTopClick(this);
                	else if(pattern==1||pattern==2)
                		addSubjectFloder(this,pattern);
                }
            }
        }, '-', {
        	itemId:'leafTreeToolBar2',
            text: '子添加',
            tooltip: '子添加',
            icon: 'static/images/icons/fam/add.gif',
            listeners: {
                click: function () {
                	var pattern=this.up('treepanel').pattern;
                	if(pattern==0)
                		addChildClick(this);
                	else if(pattern==1||pattern==2)
                		addTestDesign(this,pattern);
                    
                }
            }
        }, '-', {
            text: '删除',
            tooltip: '删除',
            icon: 'static/images/icons/fam/delete.gif',
            listeners: {
                click: function () {
                    deleteClick(this);
                }
            }
        }]
    }],
    columns: [{// 使用cellEdit就要设置这个
        xtype: "treecolumn",
        dataIndex: "text",
        flex: 12,
        field: {
            allowBlank: false
        }
    }],
    plugins: [{
        id: 'cellEdit',
        ptype: "cellediting",
        clicksToEdit: 2,
        autoCancel: true,
        listeners: {
            beforeedit: function (edit, e) {
                this.backUp = e.record.data.text;// 保存修改前的名字
            },
            edit: function (edit, e) {
                if (this.backUp != e.record.data.text
                    && e.record.data.isCreate == 0) {// 只有修改的名字不同并且该节点不是新建节点才会保存到后台
                   var backUp=this.backUp;
                	Ext.Ajax.request({
                        url: this.updateTextUrl,
                        method: 'put',
                        params: {
                            id: e.record.data.id,
                            text: e.record.data.text,
                            userId:currentUserId
                        },
                        async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
                        success: function (response, opts) {
                            e.view.up('treepanel').synchronizeTreeToForm(e.record.data.text);
                        },
                        failure: function (response, opts) {
                        	e.record.set('text', backUp);
                        	var obj = Ext.decode(response.responseText);
                        	if(obj.code==401||obj.code==402||obj.code==403)
                        		Ext.Msg.alert("错误", obj.message);
                            Ext.Msg.alert("错误", "该功能暂时不可用！");
                        }
                    });
                }else
                	e.view.up('treepanel').synchronizeTreeToForm(e.record.data.text);
            }
        }
    }],
    listeners: {
    	beforeitemexpand:function(node, eOpts){
    		if(node.data.id!='root')
    			getChildren(node, this);
    	},
        itemclick: function (view, record, item, index, e, eOpts) {
            console.log(record);
            this.itemClick(view, record, item, index, e, eOpts);
        },
        itemmouseenter: function (view, record, item, index, e, eOpts) {
            item.setAttribute('data-qtip', '双击修改名称');
        },
        beforeitemcontextmenu:function(view,record,item,index,e,eOpts){
        		return this.pattern==0||this.pattern==1;//只要测试需求和测试计划的树形菜单才有右键功能
        },
        itemcontextmenu:function( view, record, item, index, e, eOpts){
        	//禁用浏览器的右键相应事件
    		e.preventDefault();
            e.stopEvent();
            if(this.pattern==0)
            	testReqLeftTreeRightMenu.showAt(e.getXY());//让右键菜单跟随鼠标位置
            else
            	testDesignLeftTreeRightMenu.showAt(e.getXY());//让右键菜单跟随鼠标位置
        }
    },
    constructor: function () {
        this.callParent(arguments); // 调用父类的构造函数,不然会报错
        this.setStore(arguments[0]);// 设置树的store
        this.deleteUrl = arguments[1];// 设置删除节点的后台Url
        this.getChildrenUrl = arguments[2];// 设置获取儿子节点的后台Url
        this.getPlugin('cellEdit').updateTextUrl = arguments[3];// 设置更新节点名称的后台Url
        this.view.updateParentUrl = arguments[4];// 设置更改节点父亲节点Id的后台Url
        this.resertForm = arguments[5];// 设置清空表单数据的方法
        this.showForm = arguments[6];// 设置将表单数据显示到中心页面的方法
        this.itemClick = arguments[7];// 设置节点点击触发的函数
        this.synchronizeTreeToForm = arguments[8];// 设置节点修改名称之后怎么同步更新到表单的函数
        this.pattern=arguments[9];//设置这颗树是什么模式
        if(arguments[9]==1||arguments[9]==2){//如果是测试计划的模式或者测试执行的模式
        	this.down('#leafTreeToolBar1').text=arguments[9]==1?'主题添加':'测试集添加';
        	this.down('#leafTreeToolBar1').tooltip=arguments[9]==1?'主题添加':'测试集添加';
        	this.down('#leafTreeToolBar2').text=arguments[9]==1?'计划添加':'执行添加';
        	this.down('#leafTreeToolBar2').tooltip=arguments[9]==1?'计划添加':'执行添加';
        }
    }
});